import os
import sys

'''
目前没有一个方法可以准确的检测文本文件的code page / file encoding
对于中文问题 通常编码会出现 cp936 和 utf-8 和 utf-8-sig 三种情况
而中文版 PDMS 需要的pml 的文件编码 以cp936方式储存，否则读取会出错

对于英文字符 cp936 和 utf8 的存储方式都是一样的
BOM(Byte Order Mark) 问题仅仅出现在unicode 的 utf8 utf16 utf32 ...上

所以我们可以采取 取巧的方法
1. 以二进制方式读取文本文件
2. 对文件进行 utf8 解码 如果出现异常 则认为是 cp936 不做处理 否则去3
3. 对 utf8 解码后文件 进行 cp936 编码 如果没有异常则保存 否则 去4
4. 说明很可能 文件是 utf8-bom 以 utf8-sig 解码 并且 以cp936 编码并保存。

'''


'''
this method can detect  fileencoding only if
the codepage belongs to
ascii，ascii_bom,utf8,utf8_bom,cp936

'''
def detect(binary_data):
    data = binary_data
    try:
        data.decode('utf8')
        try:
            data.decode('utf8').encode('cp936')
            try:
                data.decode('cp936').encode('utf8')
                return 'ascii'

            except:
                return 'utf8'
        except:
            return 'utf8-bom'
    except:
        return 'cp936'


if __name__ == '__main__':
    root_directory = sys.argv[1]
    # root_directory = r'C:\AVEVA\Plant\PDMS12.0.SP6\PMLLIB'
    for path, _, files in os.walk(root_directory):
        for f in files:            
            if f.split('.')[-1].lower() in ['pmlfnc', 'pmlobj', 'pmlfnc', 'mac']:
                fp = os.path.join(path,f)

                with open(fp, 'rb') as d:
                    data = d.read()
                print('{0}:{1}'.format(detect(data).ljust(8),fp))
    input()
